package com.android.ouderenvervoer;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;
 
public class DatabaseHelper
{
	// the Activity or Application that is creating an object from this class.
	Context context;
 
	// a reference to the database used by this application/object
	private SQLiteDatabase db;
 
	// databse naam veranderen tijdens het testen anders pakt de emulator hem neit
	private final String DB_NAME = "ouderenvervoer1";
	private final int DB_VERSION = 3;
 
	// TABLE ADRESSEN
	private final String TABLE_ADRESSEN = "adressen";
	private final String ADRES_ID = "id";
	private final String ADRES_NAAM = "naam";
	private final String ADRES_STRAAT = "straat";
	private final String ADRES_HUISNUMMER = "huisnummer";
	private final String ADRES_POSTCODE = "postcode";
	private final String ADRES_PLAATS = "plaats";
	private final String ADRES_LAND = "land";
	private final String ADRES_LONGITUDE = "longitude";
	private final String ADRES_LATITUDE = "latitude";
	//TABLE INSTELLINGEN
	private final String TABLE_INSTELLINGEN = "instellingen";
	private final String INSTELLING_ID = "id";
	private final String INSTELLING_NAAM = "naam";
	private final String INSTELLING_TIJDSINTERNVAL = "tijdsinterval";
	//TABLE MIJN GEGEVENS
	private final String TABLE_MIJN_GEGEVENS = "mijn_gegevens";
	private final String MIJN_GEGEVENS_ID = "id";
	private final String MIJN_GEGEVENS_VOORNAAM = "voornaam";
	private final String MIJN_GEGEVENS_TUSSSENVOEGSEL = "tussenvoegsel";
	private final String MIJN_GEGEVENS_ACHTERNAAM = "achternaam";
	private final String MIJN_GEGEVENS_TELEFOON = "telefoon";
	private final String MIJN_GEGEVENS_MOBIELE_TELEFOON = "mobiele_telefoon";
	private final String MIJN_GEGEVENS_EMAIL = "email";
	private final String MIJN_GEGEVENS_GEBOORTEDATUM = "geboortedatum";
	private final String MIJN_GEGEVENS_ADRES = "adres"; 
	private final String MIJN_GEGEVENS_USERNAME = "username";
	private final String MIJN_GEGEVENS_WACHTWOORD = "wachtwoord";
	//TABLE MIJN REIZEN
	private final String TABLE_MIJN_REIZEN = "mijn_reizen";
	private final String MIJN_REIZEN_ID = "id";
	private final String MIJN_REIZEN_AANVRAGER = "aanvrager";
	private final String MIJN_REIZEN_BEGIN_ADRES = "begin_adres";
	private final String MIJN_REIZEN_EIND_ADRES = "eind_adres";
	private final String MIJN_REIZEN_DATUMTIJD = "datumtijd";
	private final String MIJN_REIZEN_PERSONEN = "personen";
	//nog een paar dingen toevoegen aan mijn_reizen
	
	public DatabaseHelper(Context context)
	{
		this.context = context;
		// create or open the database
		CustomSQLiteOpenHelper helper = new CustomSQLiteOpenHelper(context);
		this.db = helper.getWritableDatabase();
	}
 
	/**********************************************************************
	 * ADDING A ROW TO THE DATABASE TABLE
	 */
	public void addRowAdres(String naam, String straat, String huisnummer, String postcode, String plaats, String land, Double longitude, Double latitude)
	{
		// this is a key value pair holder used by android's SQLite functions
		ContentValues values = new ContentValues();
		values.put(ADRES_NAAM, naam);
		values.put(ADRES_STRAAT, straat);
		values.put(ADRES_HUISNUMMER, huisnummer);
		values.put(ADRES_POSTCODE, postcode);
		values.put(ADRES_PLAATS, plaats);
		values.put(ADRES_LAND, land);
		values.put(ADRES_LONGITUDE, longitude);
		values.put(ADRES_LATITUDE, latitude);
		// ask the database object to insert the new data 
		try{db.insert(TABLE_ADRESSEN, null, values);}
		catch(Exception e)
		{
			Log.e("DB ERROR addAdressen:", e.toString());
			e.printStackTrace();
		}
	}
	public void addRowInstellingen(String naam, int tijdsinternval)
	{
		ContentValues values = new ContentValues();
		values.put(INSTELLING_NAAM, naam);
		values.put(INSTELLING_TIJDSINTERNVAL, tijdsinternval);
		try{db.insert(TABLE_INSTELLINGEN, null, values);}
		catch(Exception e)
		{
			Log.e("DB ERROR addInstellingen: ", e.toString());
			e.printStackTrace();
		}
	}
	public void addRowMijnGegevens(String voornaam, String tussenvoegsel, String achternaam, String telefoon, String mobiele_telefoon, String email, String geboortedatum, int adres, String username, String wachtwoord)
	{
		ContentValues values = new ContentValues();
		values.put(MIJN_GEGEVENS_VOORNAAM, voornaam);
		values.put(MIJN_GEGEVENS_TUSSSENVOEGSEL, tussenvoegsel);
		values.put(MIJN_GEGEVENS_ACHTERNAAM, achternaam);
		values.put(MIJN_GEGEVENS_TELEFOON, telefoon);
		values.put(MIJN_GEGEVENS_MOBIELE_TELEFOON, mobiele_telefoon);
		values.put(MIJN_GEGEVENS_EMAIL, email);
		values.put(MIJN_GEGEVENS_GEBOORTEDATUM, geboortedatum);
		values.put(MIJN_GEGEVENS_ADRES, adres);
		values.put(MIJN_GEGEVENS_USERNAME, username);
		values.put(MIJN_GEGEVENS_WACHTWOORD, wachtwoord);
		// ask the database object to insert the new data 
		try{db.insert(TABLE_MIJN_GEGEVENS, null, values);}
		catch(Exception e)
		{
			Log.e("DB ERROR addMijnGegevens:", e.toString());
			e.printStackTrace();
		}
	}
	public void addRowMijnReizen(int aanvrager, int begin_adres, int eind_adres, String datumtijd, int personen)
	{
			ContentValues values = new ContentValues();
			values.put(MIJN_REIZEN_AANVRAGER, aanvrager);
			values.put(MIJN_REIZEN_BEGIN_ADRES, begin_adres);
			values.put(MIJN_REIZEN_EIND_ADRES,eind_adres);
			values.put(MIJN_REIZEN_DATUMTIJD, datumtijd);
			values.put(MIJN_REIZEN_PERSONEN, personen);
			try{db.insert(TABLE_MIJN_REIZEN, null, values);}
			catch(Exception e)
			{
				Log.e("DB ERROR addMijnGegevens:", e.toString());
				e.printStackTrace();
			}
	}
	/**********************************************************************
	 * DELETING A ROW FROM THE DATABASE TABLE
	 */
	public void deleteRowAdres(long rowID)
	{
		// ask the database manager to delete the row of given id
		try {db.delete(TABLE_ADRESSEN, ADRES_ID + "=" + rowID, null);}
		catch (Exception e)
		{
			Log.e("DB ERROR", e.toString());
			e.printStackTrace();
		}
	}
 
	/**********************************************************************
	 * UPDATING A ROW IN THE DATABASE TABLE
	 */ 
	public void updateRowAdres(long rowID, String naam, String straat, String huisnummer, String postcode, String plaats, String land, Double longitude, Double latitude)
	{
		// this is a key value pair holder used by android's SQLite functions
		ContentValues values = new ContentValues();
		values.put(ADRES_NAAM, naam);
		values.put(ADRES_STRAAT, straat);
		values.put(ADRES_HUISNUMMER, huisnummer);
		values.put(ADRES_POSTCODE, postcode);
		values.put(ADRES_PLAATS, plaats);
		values.put(ADRES_LAND, land);
		values.put(ADRES_LONGITUDE, longitude);
		values.put(ADRES_LATITUDE, latitude);
 
		// ask the database object to update the database row of given rowID
		try {db.update(TABLE_ADRESSEN, values, ADRES_ID + "=" + rowID, null);}
		catch (Exception e)
		{
			Log.e("DB Error updateADRESSEN:", e.toString());
			e.printStackTrace();
		}
	}
	public void updateRowInstellingen(long rowID, String naam, int tijdsinternval)
	{
		ContentValues values = new ContentValues();
		values.put(INSTELLING_NAAM, naam);
		values.put(INSTELLING_TIJDSINTERNVAL, tijdsinternval);
		try{db.update(TABLE_INSTELLINGEN, values, INSTELLING_ID + "=" + rowID, null);}
		catch(Exception e)
		{
			Log.e("DB ERROR updateInstellingen: ", e.toString());
			e.printStackTrace();
		}
	}
	public void updateRowMijnGegevens(long rowID, String voornaam, String tussenvoegsel, String achternaam, String telefoon, String mobiele_telefoon, String email, String geboortedatum, int adres, String username, String wachtwoord)
	{
		ContentValues values = new ContentValues();
		values.put(MIJN_GEGEVENS_VOORNAAM, voornaam);
		values.put(MIJN_GEGEVENS_TUSSSENVOEGSEL, tussenvoegsel);
		values.put(MIJN_GEGEVENS_ACHTERNAAM, achternaam);
		values.put(MIJN_GEGEVENS_TELEFOON, telefoon);
		values.put(MIJN_GEGEVENS_MOBIELE_TELEFOON, mobiele_telefoon);
		values.put(MIJN_GEGEVENS_EMAIL, email);
		values.put(MIJN_GEGEVENS_GEBOORTEDATUM, geboortedatum);
		values.put(MIJN_GEGEVENS_ADRES, adres);
		values.put(MIJN_GEGEVENS_USERNAME, username);
		values.put(MIJN_GEGEVENS_WACHTWOORD, wachtwoord);
		// ask the database object to insert the new data 
		try{db.update(TABLE_MIJN_GEGEVENS,values, MIJN_GEGEVENS_ID + "=" + rowID, null);}
		catch(Exception e)
		{
			Log.e("DB ERROR updateMijnGegevens:", e.toString());
			e.printStackTrace();
		}
	}
	public void updateRowMijnReizen(long rowID, int aanvrager, int begin_adres, int eind_adres, String datumtijd, int personen)
	{
			ContentValues values = new ContentValues();
			values.put(MIJN_REIZEN_AANVRAGER, aanvrager);
			values.put(MIJN_REIZEN_BEGIN_ADRES, begin_adres);
			values.put(MIJN_REIZEN_EIND_ADRES,eind_adres);
			values.put(MIJN_REIZEN_DATUMTIJD, datumtijd);
			values.put(MIJN_REIZEN_PERSONEN, personen);
			try{db.update(TABLE_MIJN_REIZEN, values, MIJN_REIZEN_ID + "=" + rowID, null);}
			catch(Exception e)
			{
				Log.e("DB ERROR updateMijnGegevens:", e.toString());
				e.printStackTrace();
			}
	}
 
	/**********************************************************************
	 * RETRIEVING A ROW FROM THE DATABASE TABLE
	 */
	public ArrayList<Object> getRowAsArrayAdres(long rowID)
	{
		// create an array list to store data from the database row.
		// I would recommend creating a JavaBean compliant object 
		// to store this data instead.  That way you can ensure
		// data types are correct.
		ArrayList<Object> rowArray = new ArrayList<Object>();
		Cursor cursor;
 
		try
		{
			// this is a database call that creates a "cursor" object.
			// the cursor object store the information collected from the
			// database and is used to iterate through the data.
			cursor = db.query
			(
					TABLE_ADRESSEN,
					new String[] { ADRES_ID, ADRES_NAAM, ADRES_STRAAT, ADRES_HUISNUMMER, ADRES_POSTCODE, ADRES_PLAATS, ADRES_LAND, ADRES_LONGITUDE, ADRES_LATITUDE },
					ADRES_ID + "=" + rowID,
					null, null, null, null, null
			);
 
			// move the pointer to position zero in the cursor.
			cursor.moveToFirst();
 
			// if there is data available after the cursor's pointer, add
			// it to the ArrayList that will be returned by the method.
			if (!cursor.isAfterLast())
			{
				do
				{
					rowArray.add(cursor.getLong(0));
					rowArray.add(cursor.getString(1));
					rowArray.add(cursor.getString(2));
					rowArray.add(cursor.getString(3));
					rowArray.add(cursor.getString(4));
					rowArray.add(cursor.getString(5));
					rowArray.add(cursor.getString(6));
					rowArray.add(cursor.getDouble(7));
					rowArray.add(cursor.getDouble(8));
					
				}
				while (cursor.moveToNext());
			}
 
			// let java know that you are through with the cursor.
			cursor.close();
		}
		catch (SQLException e) 
		{
			Log.e("DB ERROR", e.toString());
			e.printStackTrace();
		}
 
		// return the ArrayList containing the given row from the database.
		return rowArray;
	}
	public ArrayList<Object> getRowAsArrayMijnGegevens(long rowID)
	{
		ArrayList<Object> rowArray = new ArrayList<Object>();
		Cursor cursor;
		try
		{
			cursor = db.query
			(
					TABLE_MIJN_GEGEVENS,
					new String[] { MIJN_GEGEVENS_ID, MIJN_GEGEVENS_VOORNAAM, MIJN_GEGEVENS_TUSSSENVOEGSEL, MIJN_GEGEVENS_ACHTERNAAM, 
							MIJN_GEGEVENS_TELEFOON, MIJN_GEGEVENS_MOBIELE_TELEFOON, MIJN_GEGEVENS_EMAIL, MIJN_GEGEVENS_GEBOORTEDATUM, 
							MIJN_GEGEVENS_ADRES, MIJN_GEGEVENS_USERNAME, MIJN_GEGEVENS_WACHTWOORD },
					MIJN_GEGEVENS_ID + "=" + rowID,
					null, null, null, null, null
			);
			cursor.moveToFirst();
 
			if (!cursor.isAfterLast())
			{
				do
				{
					rowArray.add(cursor.getLong(0));
					rowArray.add(cursor.getString(1));
					rowArray.add(cursor.getString(2));
					rowArray.add(cursor.getString(3));
					rowArray.add(cursor.getString(4));
					rowArray.add(cursor.getString(5));
					rowArray.add(cursor.getString(6));
					rowArray.add(cursor.getString(7));
					rowArray.add(cursor.getLong(8));
					rowArray.add(cursor.getString(9));
					rowArray.add(cursor.getString(10));
					
				}
				while (cursor.moveToNext());
			}
			cursor.close();
		}
		catch (SQLException e) 
		{
			Log.e("DB ERROR", e.toString());
			e.printStackTrace();
		}
		return rowArray;
	}
 
 
 
	/**********************************************************************
	 * RETRIEVING ALL ROWS FROM THE DATABASE TABLE
	 */
 
	public ArrayList<ArrayList<Object>> getAllRowsAsArraysAdres()
	{
		// create an ArrayList that will hold all of the data collected from
		// the database.
		ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
 
		// this is a database call that creates a "cursor" object.
		// the cursor object store the information collected from the
		// database and is used to iterate through the data.
		Cursor cursor;
 
		try
		{
			// ask the database object to create the cursor.
			cursor = db.query(
					TABLE_ADRESSEN,
					new String[] { ADRES_ID, ADRES_NAAM, ADRES_STRAAT, ADRES_HUISNUMMER, ADRES_POSTCODE, ADRES_PLAATS, ADRES_LAND, ADRES_LONGITUDE, ADRES_LATITUDE },
					null, null, null, null, null
			);
 
			// move the cursor's pointer to position zero.
			cursor.moveToFirst();
 
			// if there is data after the current cursor position, add it
			// to the ArrayList.
			if (!cursor.isAfterLast())
			{
				do
				{
					ArrayList<Object> dataList = new ArrayList<Object>();
 
					dataList.add(cursor.getLong(0));
					dataList.add(cursor.getString(1));
					dataList.add(cursor.getString(2));
					dataList.add(cursor.getString(3));
					dataList.add(cursor.getString(4));
					dataList.add(cursor.getString(5));
					dataList.add(cursor.getString(6));
					dataList.add(cursor.getDouble(7));
					dataList.add(cursor.getDouble(8));
 
					dataArrays.add(dataList);
				}
				// move the cursor's pointer up one position.
				while (cursor.moveToNext());
			}
		}
		catch (SQLException e)
		{
			Log.e("DB Error", e.toString());
			e.printStackTrace();
		}
 
		// return the ArrayList that holds the data collected from
		// the database.
		return dataArrays;
	}
	public ArrayList<ArrayList<Object>> getAllRowsAsArraysMijnRoutes()
	{
		ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
		Cursor cursor;
 
		try
		{
			// ask the database object to create the cursor.
			cursor = db.query(
					TABLE_MIJN_REIZEN,
					new String[] { MIJN_REIZEN_ID, MIJN_REIZEN_AANVRAGER, MIJN_REIZEN_BEGIN_ADRES, MIJN_REIZEN_EIND_ADRES, MIJN_REIZEN_DATUMTIJD, MIJN_REIZEN_PERSONEN },
					null, null, null, null, null
			);
			cursor.moveToFirst();
			if (!cursor.isAfterLast())
			{
				do
				{
					ArrayList<Object> dataList = new ArrayList<Object>();
 
					dataList.add(cursor.getLong(0));
					dataList.add(cursor.getInt(1));
					dataList.add(cursor.getInt(2));
					dataList.add(cursor.getInt(3));
					dataList.add(cursor.getString(4));
					dataList.add(cursor.getInt(5));
 
					dataArrays.add(dataList);
				}
				// move the cursor's pointer up one position.
				while (cursor.moveToNext());
			}
		}
		catch (SQLException e)
		{
			Log.e("DB Error", e.toString());
			e.printStackTrace();
		}
 
		// return the ArrayList that holds the data collected from
		// the database.
		return dataArrays;
	}
 
 
 
	/**********************************************************************
	 * THIS IS THE BEGINNING OF THE INTERNAL SQLiteOpenHelper SUBCLASS.
	 * 
	 * I MADE THIS CLASS INTERNAL SO I CAN COPY A SINGLE FILE TO NEW APPS 
	 * AND MODIFYING IT - ACHIEVING DATABASE FUNCTIONALITY.  ALSO, THIS WAY 
	 * I DO NOT HAVE TO SHARE CONSTANTS BETWEEN TWO FILES AND CAN
	 * INSTEAD MAKE THEM PRIVATE AND/OR NON-STATIC.  HOWEVER, I THINK THE
	 * INDUSTRY STANDARD IS TO KEEP THIS CLASS IN A SEPARATE FILE.
	 *********************************************************************/
 
	/**
	 * This class is designed to check if there is a database that currently
	 * exists for the given program.  If the database does not exist, it creates
	 * one.  After the class ensures that the database exists, this class
	 * will open the database for use.  Most of this functionality will be
	 * handled by the SQLiteOpenHelper parent class.  The purpose of extending
	 * this class is to tell the class how to create (or update) the database.
	 * 
	 * @author Randall Mitchell
	 *
	 */
	private class CustomSQLiteOpenHelper extends SQLiteOpenHelper
	{
		public CustomSQLiteOpenHelper(Context context)
		{
			super(context, DB_NAME, null, DB_VERSION);
		}
 
		@Override
		public void onCreate(SQLiteDatabase db)
		{
			//CREATE TABLE ADRESSEN
			String newTableQueryString = "create table " + TABLE_ADRESSEN + " (" +
										ADRES_ID + " integer primary key autoincrement not null," +
										ADRES_NAAM + " text," +
										ADRES_STRAAT + " text," +
										ADRES_HUISNUMMER + " text," +
										ADRES_POSTCODE + " text," +
										ADRES_PLAATS + " text," +
										ADRES_LAND + " text," +
										ADRES_LONGITUDE + " double," +
										ADRES_LATITUDE + " double" +
										");";
			// execute the query string to the database.
			db.execSQL(newTableQueryString);
			//CREATE TABLE INSTELLINGEN
			String newTableInstellingenQueryString = "create table " + TABLE_INSTELLINGEN + " (" +
													INSTELLING_ID + " integer primary key autoincrement not null, " +
													INSTELLING_NAAM + " text, " +
													INSTELLING_TIJDSINTERNVAL + " text" + 
													");";
			db.execSQL(newTableInstellingenQueryString);
			//CREATE TABLE MIJN GEGEVENS
				String newTableMijnGegevensQueryString = "create table " + TABLE_MIJN_GEGEVENS + " (" +
														MIJN_GEGEVENS_ID + " integer primary key autoincrement not null, " +
														MIJN_GEGEVENS_VOORNAAM + " text, " +
														MIJN_GEGEVENS_TUSSSENVOEGSEL + " text, " +
														MIJN_GEGEVENS_ACHTERNAAM + " text, " +
														MIJN_GEGEVENS_TELEFOON + " text, " +
														MIJN_GEGEVENS_MOBIELE_TELEFOON + " text, " + 
														MIJN_GEGEVENS_EMAIL + " text, " +
														MIJN_GEGEVENS_GEBOORTEDATUM + " text, " +
														MIJN_GEGEVENS_ADRES + " integer, " +
														MIJN_GEGEVENS_USERNAME + " text, " + 
														MIJN_GEGEVENS_WACHTWOORD + " text, " +
														"FOREIGN KEY (" + MIJN_GEGEVENS_ADRES + ") REFERENCES " + TABLE_ADRESSEN + "(" + ADRES_ID + ")" +
														");";
				db.execSQL(newTableMijnGegevensQueryString);
				//CREATE TABLE REIZEn
				String newTableMijnReizenQueryString = "create table " + TABLE_MIJN_REIZEN + " (" +
														MIJN_REIZEN_ID + " integer primary key autoincrement not null, " +
														MIJN_REIZEN_AANVRAGER + " integer, " +
														MIJN_REIZEN_BEGIN_ADRES + " integer, " +
														MIJN_REIZEN_EIND_ADRES + " integer, " +
														MIJN_REIZEN_DATUMTIJD + " text, " + 
														MIJN_REIZEN_PERSONEN + " integer, " +
														"FOREIGN KEY (" + MIJN_REIZEN_EIND_ADRES + ") REFERENCES "+ TABLE_ADRESSEN + "(" + ADRES_ID + "), " +
														"FOREIGN KEY (" + MIJN_REIZEN_BEGIN_ADRES + ") REFERENCES "+ TABLE_ADRESSEN + "(" + ADRES_ID + "), " + 
														"FOREIGN KEY (" + MIJN_REIZEN_AANVRAGER + ") REFERENCES "+ TABLE_MIJN_GEGEVENS + "(" + MIJN_GEGEVENS_ID + ") " +
														");";
				db.execSQL(newTableMijnReizenQueryString);
		}
 
 
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
		{
			// NOTHING TO DO HERE. THIS IS THE ORIGINAL DATABASE VERSION.
			// OTHERWISE, YOU WOULD SPECIFIY HOW TO UPGRADE THE DATABASE.
		}
	}
}
